package com.yzh.oop5.teacher;

/**
 *内部类：非静态成员内部类
 * 1.内部类作为类的成员，可以使用四个权限修饰符修饰，这一点，和外部类不同
 * 2.内部类的方法可以直接访问外部的成员
 * 3.外部类不可以直接访问内部类的成员，需要先创建内部类的对象，通过对象名来访问
 * 4.内部类如何访问外部类的成员变量：
 *   System.out.println(num);//30
 *   System.out.println(this.num);//20
 *   System.out.println(OuterClass.this.num);//10
 *
 * 5.如何直接创建一个非静态成员内部类对象：必须先创建一个外部类的对象
 *  OuterClass oc2 = new OuterClass();
 *  InnerClass ic = oc2.new InnerClass();
 * 6.内部类会编译成一个单独的class文件
 * OuterClass$InnerClass.class
 */
public class OuterClass {
    //成员变量
    private String name;
    private int num=10;

    //构造方法
    public OuterClass() {
    }
    public OuterClass(String name, int num) {
        this.name = name;
        this.num = num;
    }

    //成员方法
    public void methodOut1(){

    }
    public void methodOut2(){
        //methodInner();
        InnerClass ic = new InnerClass();
        ic.methodInner();
    }


    //代码块
    {
        System.out.println("============code block========");
    }

    //内部类
    public class InnerClass{
        //成员变量
        private int num = 20;
        //构造方法

        //成员方法
        public void methodInner(){
            int num = 30;
            System.out.println(name);
            methodOut1();
            System.out.println(num);//30
            System.out.println(this.num);//20
            System.out.println(OuterClass.this.num);//10
        }

        public void methodInner2(){}


        //代码块

        //内部类
    }
}
